class MyType(type):
    def __init__(self, *args, **kwargs):
        print("Mytype __init__", *args, **kwargs)
    # 对象() 会触发,即 Foo("Alex") 就会触发 self 为触发的对象Foo
    # 创建对象时,比如 p= Person() , Person() 会调用元类的call,
    # 所以必须要返回创建好的对象实例给 p并调用init初始化数据 ,否则实例没有用
    def __call__(self, *args, **kwargs):
        print("-----------", self)  # <class '__main__.Foo'>
        print("Mytype __call__", *args, **kwargs)
        obj = self.__new__(self)  # 调用创建好的Foo类__new__给实例p分配内存,其实是调用了object类的__new__
        self.__init__(obj, *args, **kwargs)  # obj,即 p 实例
        return obj
    # __new__ 方法参数一般有 cls(将要创建的类), name(类名), bases(基类), attrs(属性函数字典)
    # 创建类的时候其实是调用了type的__new__方法为这个类分配内存空间，创建
    # 好了之后再调用type的__init__方法初始化（做一些赋值等）,所以可以通过这个new函数里自定义创建类过程
    def __new__(cls, *args, **kwargs):
        print("Mytype __new__", *args, **kwargs)
        return type.__new__(cls, *args, **kwargs)

class Foo(object,metaclass=MyType):  # 指定元类为MyType,即创建Foo类由MyType创建
    def __init__(self, name):
        self.name = name
        print("Foo __init__")
    def __new__(cls, *args, **kwargs):
        print("Foo __new__", cls, *args, **kwargs)
        return object.__new__(cls)
    def eat(self):
        print("%s 吃饭" %self.name)
f = Foo("Alex")
f.eat()